home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
disp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-18
|
22KB
|
1,050 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
#include "doslib.h"
/* 画面制御 */
/* チェックして、必要ならば画面にエコーする */
/* 行の文字列が変更を受けたのでアップデートするのだ */
void
disp_check_1line_echo(register UNIT *tp)
{
register short int i;
register UNIT **s,*p;
for(s=SCREEN,i=0;i<YWIDTH-1;s++,i++) {
if ((p = *s) == tp) {
disp_1line(i,tp);
}
}
}
/* チェックして、必要ならば画面にエコーする */
/* 挿入である */
void
disp_check_1line_insert(UNIT *line,register UNIT *tp)
{
register short int i;
register UNIT **s,*p;
for(s=SCREEN,i=0;i<YWIDTH;s++,i++) {
if (*s == tp) {
/* *s = line;*/
disp_1line(i,line);
while(s[1] != NOT) { /* 下の行が、空行もしくは何かある */
i++;
if ((p = (*s++)->ATO) == NIL) break;
/* 空行ならもう終わり */
disp_1line(i,p);
/* *s = p;*/
}
}
}
}
static UBYTE disp_work[VERY_LONG_LINE];
/* 1行だけ y の位置に表示する */
/* y は絶対座標である */
void
disp_1line(int y, UNIT *unit_pointer)
{
int x;
if (unit_pointer) {
line_get_body(disp_work,unit_pointer);
etc_bit_convert_and_disp(0,y,disp_work);
} else {
etc_bit_convert_and_disp(0,y,"");
}
SCREEN[y] = unit_pointer; /* スクリーン更新 */
}
/* 1行だけカレントウインドウの y(相対) の位置に表示する */
void
disp_1line_rel(int y, UNIT *unit_pointer)
{
disp_1line(CWY0+y,unit_pointer);
}
UBYTE BOTTOM_FORMAT0[] = "===== ThunderWord V1.24 \
========================================================================";
UBYTE BOTTOM_FORMAT1[] = "----- ThunderWord V1.24 \
------------------------------------------------------------------------";
/*
================================================================================================
=***= ThunderWord V0.4 ==[全角:ひら:ROMA:無変]== 0123456789abcdefgh.zzz =========================
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
0 8 16 24 32 40 48 56 64 72 80 88
=[半角:カタ:通常:変換]=
*/
/* カレントテキストに changed mark を付ける */
/* カレントテキストを表示しているすべてのウインドウに対して行う */
void
disp_btm_changed_10()
{
disp_cursor_off();
if (CURRENT_CHANGED) {
disp_btm_changed_x(CURRENT_TEXT);
} else {
disp_btm_changed_erase_x(CURRENT_TEXT);
}
}
/* カレントテキストに changed mark を付ける */
/* カレントテキストを表示しているすべてのウインドウに対して行う */
void
disp_btm_changed()
{
disp_cursor_off();
if (!CURRENT_CHANGED) {
disp_btm_changed_x(CURRENT_TEXT);
CURRENT_CHANGED = 1;
}
}
/* テキストに bak mode を表示する */
/* テキストを表示しているすべてのウインドウに対して行う */
void
disp_btm_bak_10_x(int tn)
{
disp_cursor_off();
if (TDATA[tn].BAK_FLAG) {
disp_btm_changed_x_sub(tn,3,'B');
} else {
disp_btm_changed_x_sub(tn,3,'\0');
}
}
/* テキストに changed mark を付ける */
/* テキストを表示しているすべてのウインドウに対して行う */
void
disp_btm_changed_10_x(int tn)
{
disp_cursor_off();
if (TDATA[tn].CHANGED_FLAG) {
disp_btm_changed_x(tn);
} else {
disp_btm_changed_erase_x(tn);
}
}
/* 指定されたテキストに changed mark を付ける */
/* そのテキストを表示しているすべてのウインドウに対して行う */
void
disp_btm_changed_x(int tn)
{
disp_btm_changed_x_sub(tn,1,'*');
}
void
disp_btm_changed_x_sub(int tn,int x,UBYTE c)
{
register int i;
UBYTE wlist[MAX_WINDOW]; /* フラグ用 */
window_which_has_text_number(tn,wlist);
disp_cursor_off();
etc_color(MIZU_EMPH_REV);
for(i = 0;i < MAX_WINDOW;i++) {
if (wlist[i]) { /* そのテキストが割り当てられているウインドウである */
window_abs_loc(x,WDATA[i].WY1+1);
if (c) {
B_PUTC(c);
} else if (i == CWN) {
B_PUTC('=');
} else {
B_PUTC('-');
}
}
}
etc_color(NORMAL);
}
/* カレントから changed mark を外す */
/* カレントテキストを表示しているすべてのウインドウに対して行う */
void
disp_btm_changed_erase_x(int tn)
{
disp_btm_changed_x_sub(tn,1,'\0');
}
/* 指定されたウインドウの、BOTTOM を表示する */
void
disp_btm_line(int wn)
{
UBYTE work[MAXLINE];
UBYTE work2[MAXLINE];
UBYTE w[5];
int i,x;
/* 元をコピー */
if (wn == CWN) {
strcpy(work,BOTTOM_FORMAT0);
} else {
strcpy(work,BOTTOM_FORMAT1);
}
if (i = strlen(FILE_NAMES_ST[WDATA[wn].WTEXTS].CONTENT)) {
/* if (i = strlen(FILE_NAMES[WDATA[wn].WTEXTS].CONTENT)) {*/
int j;
strncpy(&work[49],FILE_NAMES_ST[WDATA[wn].WTEXTS].CONTENT,i);
work[48] = ' ';
if (i+49 < XWIDTH) {
work[49+i] = ' ';
strcpy(&work2[1],FILE_NAMES[WDATA[wn].WTEXTS].CONTENT);
/* etc_get_pathname(&work2[1],FILE_NAMES[WDATA[wn].WTEXTS].CONTENT);*/
if (work2[1]) {
*work2 = ' ';
strcat(work2," ");
} else {
*work2 = EOS;
}
} else {
*work2 = EOS;
}
j = strlen(work2);
if (j > XWIDTH-(49+i+3)+1) { /* 長過ぎるのでカット */
j = XWIDTH-(49+i+3)-1;
work[XWIDTH-1] = '$';
} else {
strncpy(&work[49+i+3],work2,j);
}
work[XWIDTH] = EOS;
} else {
return;
}
if (WDATA[wn].WY1+2 == UNDER_Y) {
strncpy(&work[25],"[ : : : ]",46-25);
/* strncpy(&work[25],"[全角:カタ:かな:変換]",46-25);*/
/* strncpy(&work[25],"[半角:----:----:無変]",46-25);*/
for(i = 0,x = 26;x <= 41;i++,x += 5) {
if (FP_MODE[i] == (UBYTE)"ZKRM"[i]) {
strncpy(&work[x],&("全角かなROMA無変"[i*4]),4);
} else {
strncpy(&work[x],&("半角--------変換"[i*4]),4);
}
}
}
etc_color(MIZU_EMPH_REV);
disp_btm_line0(wn,work);
disp_btm_changed_10_x(WDATA[wn].WTEXTS);
disp_btm_bak_10_x(WDATA[wn].WTEXTS);
etc_color(NORMAL);
}
/* 指定されたウインドウの、BOTTOM の位置に文字列を表示する */
void
disp_btm_line0(int wn, STR s)
{
disp_cursor_off();
window_abs_loc(0,WDATA[wn].WY1+1);
B_PRINT(s);
SCREEN[WDATA[wn].WY1+1] = NOT; /* -1 */
fep_follow_led();
}
void
disp_show_cursor()
{
B_BPOKE(0x991,0); /* OFF フラグをセット */
B_WPOKE(0x9bc,1); /* ダウンカウンタを1に */
}
void
disp_cursor_off()
{
B_CUROFF();
}
void
disp_cursor_on()
{
B_CURON();
}
/* CL がウインドウの中心-1行に来るように書き直す */
void
disp_cl_center_1()
{
disp_cl_y((CWY1-CWY0)/2-1);
}
/* CL がウインドウの中心に来るように書き直す */
void
disp_cl_center()
{
disp_cl_y((CWY1-CWY0)/2);
}
/* CL がウインドウの y 行目に来るように書き直す */
void
disp_cl_y(int y)
{
int movel;
disp_top_flush(line_trace(CL,-y,&movel));
CY = -movel;
}
/* 指定された行を最上行として画面を書き直す */
void
disp_top_flush(UNIT *top)
{
disp_middle_flush(0,top);
}
/* 指定された行を i 行として以下の画面を書き直す */
void
disp_middle_flush(int t,UNIT *top)
{
int i;
for(i = 0;i < t;i++);
for(;i <= CWY1 - CWY0;i++) {
disp_1line_rel(i,top);
if (top) {
if (top == TAIL) {
top = NIL;
} else {
top = top->ATO;
}
}
}
}
/* 前を後で置き換える */
void
disp_replace(UNIT *d,UNIT *s)
{
register int i;
register UNIT **sc;
for(sc=SCREEN,i=0;i<YWIDTH;sc++,i++) {
if (*sc == d) {
disp_1line(i,s);
}
}
}
/* SCREEN[] で、前を後で置き換える */
void
disp_replace_SCREEN(UNIT *d,UNIT *s)
{
register int i;
register UNIT **sc;
for(sc=SCREEN,i=0;i<YWIDTH;sc++,i++) {
if (*sc == d) {
*sc = s;
}
}
}
/* up0 を見付たら、次の行を up で書き換え、さらにボトムに当たるまで書き直す */
void
disp_replace_after(UNIT *up0, UNIT *up)
{
register int i;
register UNIT **sc,*wp;
for(sc=SCREEN,i=0;i<YWIDTH;) {
if (sc[i] == up0) {
i++;
wp = up;
while(sc[i] != NOT) {
disp_1line(i++,wp);
if ((wp == TAIL) && (sc[i] != NOT)){
disp_1line(i,NIL);
break;
}
wp = wp->ATO;
}
} else {
i++;
}
}
}
/* SCREN に up0 を見付たら、次の行を up で書き換え、さらにボトムに当たるまで書き直す */
void
disp_replace_after_SCREEN(UNIT *up0, UNIT *up)
{
register int i;
register UNIT **sc,*wp;
for(sc=SCREEN,i=0;i<YWIDTH;) {
if (sc[i] == up0) {
i++;
wp = up;
while(sc[i] != NOT) {
sc[i++] = wp;
if ((wp == TAIL) && (sc[i] != NOT)){
sc[i] = NIL;
break;
}
wp = wp->ATO;
}
} else {
i++;
}
}
}
/* 指定されたウィンドウを、top を最上行として書き直す */
void
disp_window_top_flush(int wn,UNIT *top)
{
int i;
for(i = WDATA[wn].WY0;i <= WDATA[wn].WY1;i++) {
disp_1line(i,top);
if (top) {
if (top == TAIL) {
top = NIL;
} else {
top = top->ATO;
}
}
}
disp_btm_line(wn);
}
/* すべてのウインドウを描き直す。ただし、ボトムはいじらない */
void
disp_all_window_redraw()
{
register int i;
register UNIT *p;
for(i=0;i<YWIDTH-1;i++) {
if ((p = SCREEN[i]) != NOT) {
disp_1line(i,p);
}
}
work_cursor_cpx();
}
/* 1行だけ y の位置に表示する */
/* y は絶対座標である */
void
disp_1line_rel_trans0(int x,int y, STR string)
{
etc_bit_convert_and_disp(x,CWY0+y,string);
}
/* 指定された位置から文字列を表示する */
/* y は絶対座標である */
/* 新しい X 座標を返す */
int
disp_half_line(int x,int y,STR s)
{
return(etc_bit_convert_and_disp(x,y,s));
}
/* カレントウインドウの y(相対) の位置に半行表示する */
/* 新しい X 座標を返す */
int
disp_half_line_rel(int x,int y, STR s)
{
return(disp_half_line(x,CWY0+y,s));
}
/* 指定された行を y 座標として、それ以降の画面を書き直す */
/* ちゃんとエコーする */
void
disp_half_flush(UNIT *top,int y)
{
register int i;
register int delta = CWY1-CWY0;
for(i = y;i <= delta;i++) {
disp_1line_rel(i,top);
if (top) {
if (top == TAIL) {
top = NIL;
} else {
top = top->ATO;
}
}
}
}
extern UBYTE koho_10[10+1][MAXLINE];
extern UWORD koho_10x[10+1];
/* 候補ブロック( <= 9)を表示する */
int
disp_koho_block(int kn)
{
register int i;
int x;
window_abs_loc(0,UNDER_Y+1);
B_PRINT("\x1b[0K"); /* カーソルから右をクリア */
x = 0;
for(i=1;i<=9;i++) {
if (*koho_10[i]) { /* 候補があるなら */
koho_10x[i] = x;
disp_koho(i,kn,&x,koho_10[i]);
} else {
break;
}
}
}
/* 最下行に候補を表示する */
/* x を更新する */
/* 表示しきれない時は非零を返す */
int
disp_koho(int n,int kn,int *x,STR koho)
{
UBYTE koho_d[MAXLINE];
window_abs_loc(*x,UNDER_Y+1);
B_PUTC(n+'0');
B_PUTC('.');
if (n == kn) {
etc_color(10); /* 選択色 */
}
etc_string_esc_cnv(koho,koho_d);
B_PRINT(koho_d);
*x = (B_LOCATE(-1,0) >> 16) + 1;
if (n = kn) {
etc_color(NORMAL); /* 戻す */
}
return(*x > 80);
}
void
disp_cr_mode()
{
if (CR_VIEW) {
KAIGYOU_CODE = KAIGYOU0;
KAIGYOU_HIGH = 0x81;
KAIGYOU_LOW = 0xde;
} else {
KAIGYOU_CODE = L' ';
KAIGYOU_HIGH = KAIGYOU_CODE >> 8;
KAIGYOU_LOW = KAIGYOU_CODE & 0xff;
}
}
/* 変えたら非零を返す */
int
disp_tab_change(int a)
{
if ((a <= 0) || (a > TAB_LENGTH_LIMIT) || (a > CURRENT_JIZUME)) {
/* 何もしない */
} else {
UNIT *wp;
int bp,y;
etc_set_tab(a);
line_seigyou();
under_print((STR)"タブ変更:作業中・・・");
mark_set_mark(XCODE_SYSMARK - XCODE_MARK + CWN); /* システムマーク */
wp = HEAD->ATO; /* 先頭行 */
line_arrange_all(wp);
wp = mark_get_mark(XCODE_SYSMARK - XCODE_MARK + CWN,&bp);
mark_erase_mark(XCODE_SYSMARK - XCODE_MARK + CWN); /* システムマークを消す */
CL = wp;
line_cl_cl();
disp_cl_y(CY);
work_line_analyze();
CPX = work_byte_to_CPX(bp);
CX0 = CX = ANALYZE[CPX].XPOS;
under_blanc();
return(1);
}
return(0);
}
/* 1行スクロールアップする */
/* 最後に転送したポインタを返す */
/* はみ出したなら */
UNIT *
disp_scroll_up1()
{
register int lyw_total,yw;
register int cwy0,cwy1;
UNIT *last;
register int i,j;
lyw_total = LYW_TOTAL/4;
cwy0 = CWY0;
last = SCREEN[cwy1 = CWY1];
if (yw = lyw_total*(cwy1-cwy0)) { /* スクロールするラスタユニット数 */
TXRASCPY((cwy0+1)*lyw_total*256+cwy0*lyw_total,yw,0x0003);
for(i=cwy0,j=cwy0+1;j<=cwy1;i++,j++) {
SCREEN[i] = SCREEN[j];
}
SCREEN[cwy1] = NIL;
}
return(last);
}
/* 1行スクロールダウンする */
/* 最後に転送したポインタを返す */
UNIT *
disp_scroll_dn1()
{
register int lyw_total,yw;
register int cwy0,cwy1;
UNIT *last;
register int i,j;
lyw_total = LYW_TOTAL/4;
last = SCREEN[cwy0 = CWY0];
cwy1 = CWY1;
if (yw = lyw_total*(cwy1-cwy0)) { /* スクロールするラスタユニット数 */
TXRASCPY((cwy1*lyw_total-1)*256+(cwy1+1)*lyw_total-1,yw,0x8003);
for(i=cwy1,j=cwy1-1;j>=cwy0;i--,j--) {
SCREEN[i] = SCREEN[j];
}
SCREEN[cwy0] = NIL;
}
return(last);
}
void
disp_hmode()
{
register int i;
for(i=0;i<MAX_WINDOW;i++) {
if (WDATA[i].WY1+2 == UNDER_Y) {
break;
}
}
disp_btm_line(i);
}
/* 最下行に記号候補を表示する */
/* 16個ずつかく */
void
disp_kigou_koho()
{
int xn;
UBYTE w[MAXLINE];
int kigou_block;
register int i;
UBYTE spacer[4];
sprintf((char *)w,"[記号入力] <%4X>",kigou_begin);
window_abs_loc(0,UNDER_Y+1);
etc_color(MIZU_REV);
B_PRINT(w);
window_abs_loc(17,UNDER_Y+1);
kigou_block = kigou_begin & 0xfff0;
xn = kigou_begin & 0x000f;
if (etc_char_disp_len(etc_normal_jis(kigou_begin)) == 1) {
strcpy(spacer," ");
} else {
strcpy(spacer," ");
}
for(i = 0;i<16;i++) {
etc_color(RAW0);
B_PRINT(spacer);
if (i == xn) {
etc_color(MIZU_REV);
}
B_PUTC(etc_normal_jis(kigou_block+i));
}
etc_color(NORMAL);
B_PRINT("\x1b[0K");
}
/* 指定位置から文字列 string を表示する */
/* 左側には fl がある */
/* 画面外に出そうになったら、スクロールアップし、その行数を返す */
/* CWY1-CWY0 が最下行 */
int
disp_out_stop(STR fl,int *bx,int *by,STR string)
{
UBYTE l[VERY_LONG_LINE*4], s[VERY_LONG_LINE*4];
register int fl_len;
register int flag;
register int ly = CWY1-CWY0;
register int scroll_up_counter = 0;
if (!*string) {
return(0);
}
fl_len = strlen(fl); /* 左側の長さを調べる */
cut_2line_link_check(fl,string,fl,s,CURRENT_JIZUME);
/* 左側と string を接続してカットする */
if (*s) { /* 1行ではおさまらなかった(string は2行以上にまたがる) */
*bx = etc_bit_convert_and_disp(*bx,CWY0+*by,&fl[fl_len]);
#if 0
*bx = disp_half_line(x,CWY0+y,s);
*bx = disp_half_line_rel(*bx,*by,&fl[fl_len]); /* まずは1行表示 */
#endif
while(*s) {
if (++(*by) > ly) { /* ウインドウからはみ出る */
register UNIT *uuu;
scroll_up_counter++;
if (CY) {
uuu = disp_scroll_up1();
SCREEN[CWY1] = uuu->ATO;
(*by)--; /* 戻す */
CY--;
} else {
return(scroll_up_counter);
}
}
cut_line(s,l,s,CURRENT_JIZUME);
/*etc_beep();*/
*bx = etc_bit_convert_and_disp(0,CWY0+*by,l);
/* *bx = disp_half_line_rel(0,*by,l);*/
}
strcpy(fl,l); /* 最後に表示した物を fl とする */
if (etc_last(fl) == CR) { /* 最後に表示した行が改行で終わっている */
(*by)++; /* 次に表示を開始するのは、もう一行先 */
*bx = 0; /* の行頭から */
*fl = EOS;
}
return(scroll_up_counter);
} else { /* 1行でおさまった */
*bx = disp_half_line_rel(*bx,*by,&fl[fl_len]);
if (etc_last(string) == CR) {
(*by)++;
*bx = 0;
*fl = EOS;
}
return(0);
}
}
UWORD CRX,CRY;
UWORD FCR;
/* 指定された行のバイト位置を x,y として、それ以降の画面を書き直す */
/* 見える範囲内だけ、超特急で書く */
/* もちろんカレントウインドウだけ */
/* 多少いい加減でも速度の方を優先 */
/* TEXT に反映しない */
/* あとでエコーするでしょ */
/* TBUFF_R が最初にある */
/* 改行で節約できたらする */
void
disp_trans_half_flush(UNIT *p0,int bp,int x,int y)/* ,,, */
{
UBYTE l[VERY_LONG_LINE*8], s[VERY_LONG_LINE*8];
register UNIT *p;
register int flag;
register UWORD c;
int y0;
FCR = 1;
p = p0;
*l = EOS;
CUT_GETA = x; /* フラッシュの開始点 */
y0 = y;
while(SCREEN[CWY0+y0] != p) {
y0--;
if ((y0 < 0) || (CWY0+y0 < 0)) {
y0 = y;
while(SCREEN[CWY0+y0] != p) {
y0++;
}
break;
}
}
for(;y0 <= y;y0++) {
if (p == TAIL) {
break;
}
line_cat_body(l,p);
p = p->ATO;
}
if (p != TAIL) {
line_cat_body(l,p);
}
/*under_print(l);binkey();*/
/* p = p0;*/
if (x >= CURRENT_JIZUME) {
if (l[bp] != CR) {
x = 0;
if (++y > (CWY1-CWY0)) { /* いきなり画面外である */
CUT_GETA = 0;
return;
}
}
}
flag = cut_line(&l[bp],s,l,CURRENT_JIZUME-x); /* 最初の半行 */
if (((c = etc_last(s)) == CR) || flag) { /* 余りがある=完全に一行が取れた */
/* disp_1line_rel_trans0(x,y,s);*/
/* CUT_GETA = 0;*/
if (c == CR) { /* !!!改行を書こうとしている */
if (CRX) { /* 既に書いた */
if (CRY == y) { /* 前回と同じ行に改行を書く */
disp_1line_rel_trans0(x,y,s);
CUT_GETA = 0;
return;
} else { /* 最初の改行が移動した? */
if (FCR) {
if (!x && (y == CRY+1)) {
/* x が非零ならば、未変換を左に持つ行かも知れない */
disp_trans_scroll_dn1(y);
disp_1line_rel_trans0(x,y,s);
CRY = y;
return;
}
CRY = y; /* 続行 */
}
}
} else { /* まだ書いてない */
CRX = 1;
CRY = y;
}
FCR = 0;
}
disp_1line_rel_trans0(x,y,s);
CUT_GETA = 0;
#if 0
if (!flag && (c == CR)) {
window0();printf("[%d][%d]",y0,y);
return;
}
#endif
if (p != TAIL) {
p = p->ATO;
}
#if 0
if (p == TAIL) { /* 末行だ,,,, */
line_append1(p = line_get_free());
} else {
p = p->ATO;
}
/* これ以降、p の先頭に l を挿入すれば良い */
#endif
} else {
strcpy(l,s); /* 戻す */
p = p->ATO;
if ((p == TAIL) || (!p)) { /* もう後の行は無い */
disp_1line_rel_trans0(x,y,l);
CUT_GETA = 0;
/* ウインドウ最下行までを消して終了 */
for(y++;y <= (CWY1-CWY0);y++) {
disp_half_line_rel(0,y,(STR) "");
}
return;
}
line_cat_body(l,p); /* 次の行を追加する */
#if 0
flag = cut_line(&l[bp],s,l,CURRENT_JIZUME-x); /* 最初の半行 */
#else
flag = cut_line(l,s,l,CURRENT_JIZUME-x); /* 最初の半行 */
#endif /* flag = strlrn(l) */
if (((c = etc_last(s)) == CR) || flag) {
/* 余りがある=完全に一行が取れた */
/* disp_1line_rel_trans0(x,y,s);*/
/* CUT_GETA = 0;*/
if (c == CR) { /* !!!改行を書こうとしている */
if (CRX | CRY) { /* 既に書いた */
if (CRY == y) { /* 前回と同じ行に改行を書く */
disp_1line_rel_trans0(x,y,s);
CUT_GETA = 0;
return;
} else {
if (FCR) {
if (y == CRY+1) {
disp_trans_scroll_dn1(y);
disp_1line_rel_trans0(x,y,s);
CRY = y;
return;
}
CRY = y; /* 続行 */
}
}
} else { /* まだ書いてない */
CRX = 1;
CRY = y;
}
FCR = 0;
}
disp_1line_rel_trans0(x,y,s);
CUT_GETA = 0;
#if 0
if (flag == i) {
etc_beep();etc_beep();
return;
}
#endif
p = p->ATO;
/* これ以降、p の先頭に l を挿入すれば良い */
} else {
/* 出入りが無かったのだから、これで終わり */
disp_1line_rel_trans0(x,y,s);
#if 1
CUT_GETA = 0;
return;
#endif
}
}
CUT_GETA = 0; /* ダメ押し */
y++;
disp_line_wave(p,y,l);
}
UBYTE ccc = 15;
/* up の指す行(位置は y)の行頭に s を挿入し、次々に送って行く */
/* エコーしない */
/* テキストに反映しない */
/* 改行で節約できたらする */
void
disp_line_wave(UNIT *up,int y,STR s)
{
UBYTE l[VERY_LONG_LINE*8],t[VERY_LONG_LINE*8];
register UNIT *wp = up;
register int i;
register int ly;
if (y > (ly = (CWY1-CWY0))) {
return;
}
/*
window0();
printf("[%s][%s]",s,up->BODY);binkey();
*/
/*etc_color(ccc);if (ccc == 15) ccc = 14; else ccc = 15;*/
strcpy(l,s);
if (wp != TAIL) {
line_cat_body(l,wp);
}
while(y <= ly) {
/* s1 -> s2(切り出し)+ s3(余り)s1 == s3 でもOK */
if (cut_line(l,t,l,CURRENT_JIZUME)) { /* 余りの長さを返す */
/* etc_bit_convert_and_disp(0,CWY0+y,t);*/
if (etc_last(t) == CR) { /* !!!改行を書こうとしている */
if (CRX | CRY) { /* 既に書いた */
if (CRY == y) { /* 前回と同じ行に改行を書く */
etc_bit_convert_and_disp(0,CWY0+y,t);
return;
} else {
if (FCR) {
if (y == CRY+1) {
disp_trans_scroll_dn1(y);
etc_bit_convert_and_disp(0,CWY0+y,t);
CRY = y;
return;
}
CRY = y; /* 続行 */
}
}
} else { /* まだ書いてない */
CRX = 1;
CRY = y;
}
FCR = 0;
}
etc_bit_convert_and_disp(0,CWY0+y,t);
if (wp != TAIL) {
wp = wp->ATO;
line_cat_body(l,wp);
}
} else { /* 余りが無い */
/* etc_bit_convert_and_disp(0,CWY0+y,t);*/
if (etc_last(t) == CR) { /* !!!改行を書こうとしている */
if (CRX | CRY) { /* 既に書いた */
if (CRY == y) { /* 前回と同じ行に改行を書く */
etc_bit_convert_and_disp(0,CWY0+y,t);
return;
} else {
if (FCR) {
if (y == CRY+1) {
disp_trans_scroll_dn1(y);
etc_bit_convert_and_disp(0,CWY0+y,t);
CRY = y;
return;
}
CRY = y; /* 続行 */
}
}
} else { /* まだ書いてない */
CRX = 1;
CRY = y;
}
FCR = 0;
}
etc_bit_convert_and_disp(0,CWY0+y,t);
wp = wp->ATO;
if ((!wp) || (wp == TAIL)) {
/* ウインドウ最下行までを消して終了 */
for(++y;y <= (CWY1-CWY0);y++) {
etc_bit_convert_and_disp(0,CWY0+y,(STR)"");
}
break; /* 終了 */
} else {
line_cat_body(l,wp);
}
}
y++;
}
/*error("5");*/
}
/* y 行から下を n 行スクロールダウンする */
/* y は相対 */
void
disp_trans_scroll_dn1(int y)
{
register int lyw_total,yw;
register int wy0,wy1;
UBYTE w[MAXLINE];
/*sprintf(w,"(%d)(%d)",y,n);under_print(w);binkey();*/
lyw_total = LYW_TOTAL/4;
wy0 = CWY0 + y;
wy1 = CWY1;
if (yw = lyw_total*(wy1-wy0)) { /* スクロールするラスタユニット数 */
/* TXRASCPY(((wy1-n+1)*lyw_total-1)*256 + (wy1+1)*lyw_total-1,yw,0x8003);*/
TXRASCPY((wy1*lyw_total-1)*256+(wy1+1)*lyw_total-1,yw,0x8003);
}
}
void
disp_trim_tail()
{
register int i;
i = 0;
while(1) {
if (i == YWIDTH0) { /* 絶対的最後 */
return;
}
if (SCREEN[i] == TAIL) {
i++;
while(SCREEN[i] == TAIL) {
SCREEN[i++] = NULL;
if (i == YWIDTH0) { /* 絶対的最後 */
return;
}
}
} else {
i++;
}
}
}